"""
随机数生成类，可以指定一批生成的个数，可以指定数值的范围，可以调整每批生成数字的个数。
"""

import random


# 基本写法
class BaseRandom:
    def __init__(self, start=1, end=100, maxrange=1):
        self._start = start
        self._end = end
        self._maxrange = maxrange

    def create(self):
        return [random.randrange(self._start, self._end) for _ in range(self._maxrange)]


a1 = BaseRandom(50, 60, 10)
print(a1.create())


# 迭代器的方式
class GenerateRandom:
    def __init__(self, start=1, end=100, maxrange=1):
        self._start = start
        self._end = end
        self._maxrange = maxrange
        # 实例初始化时生成随机数对象，这里是将实例方法的值转换成实例变量。
        # 这个实例变量必须写在最后面，因为它要接受上面三个实例变量作为参数。
        self.gen = self._generate()

    def _generate(self):
        while True:
            yield random.randrange(self._start, self._end)

    def generate(self):
        return [next(self.gen) for _ in range(self._maxrange)]


a2 = GenerateRandom(50, 60, 10)
lst = a2.generate()
print(lst)


# 使用迭代器的方法，进阶版，控制输出个数
class AGenerateRandom:
    def __init__(self, start=1, end=100, maxrange=10):
        self._start = start
        self._end = end
        self._maxrange = maxrange
        # 实例初始化时生成随机数对象，这里是将实例方法的值转换成实例变量。
        # 这个实例变量必须写在最后面，因为它要接受上面三个实例变量作为参数。
        self.gen = self._generate()

    def _generate(self):
        while True:
            yield random.randrange(self._start, self._end)

    def generate(self, count):
        self._maxrange = count  # 会将实例属性self.maxrange重新赋值
        return [next(self.gen) for _ in range(self._maxrange)]


a = AGenerateRandom(50, 60, 10)
lst = a.generate(20)
print(lst)
